#include<iostream>//二叉平衡树判别
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int INF=1e9;
struct Treenode
{
    int data,min_val=-1e9,max_val=1e9;
    Treenode *parent,*left,*right;
};
Treenode *root=NULL;
Treenode *dic_node[1000];
Treenode *node_insert(int now,int le,int ri)
{
    if(dic_node[now]==NULL)
    {
        Treenode *temp=new Treenode;
        temp->data=now;
        temp->left=NULL;
        temp->right=NULL;
        dic_node[now]=temp;
    }
    if(le!=-1)
    {
        if(dic_node[le]==NULL)
        {
            Treenode *temp=new Treenode;
            temp->data=le;
            temp->left=NULL;
            temp->right=NULL;
            dic_node[le]=temp;
        }
        dic_node[now]->left=dic_node[le];
        dic_node[le]->parent=dic_node[now];
    }
    if(ri!=-1)
    {
        if(dic_node[ri]==NULL)
        {
            Treenode *temp=new Treenode;
            temp->data=ri;
            temp->left=NULL;
            temp->right=NULL;
            dic_node[ri]=temp;
        }
        dic_node[now]->right=dic_node[ri];
        dic_node[ri]->parent=dic_node[now];
    }
    return dic_node[now];
}
void pre_traversal(Treenode *root)
{
    if(root==NULL)return ;
    else cout<<root->data<<" ";
    pre_traversal(root->left);
    pre_traversal(root->right);
    return ;
}
void in_traversal(Treenode *root)
{
    if(root==NULL)return ;
    else 
    {
        in_traversal(root->left);
        cout<<root->data<<" ";
        in_traversal(root->right);
    }
    return ;
}
void post_traversal(Treenode *root)

{
    if(root==NULL)return ;
    else 
    {
        post_traversal(root->left);
        post_traversal(root->right);
        cout<<root->data<<" ";
    }
    return ;
}
bool check_tree(Treenode *root)//二叉平衡树判别代码
{
    if(root==NULL)return false;
    queue<Treenode*>q;
    q.push(root);
    while(!q.empty())
    {
        Treenode *temp=q.front();
        q.pop();
        if(temp->left!=NULL)
        {
            if(temp->left->data>temp->data)return false;
            if(temp->left->data<temp->min_val)return false;
            if(temp->left->data>temp->max_val)return false;
            temp->left->max_val=temp->data;
            q.push(temp->left);
        }
        else if(temp->right!=NULL)
        {
            if(temp->right->data<temp->data)return false;
            if(temp->right->data<temp->min_val)return false;
            if(temp->right->data>temp->max_val)return false;
            temp->right->min_val=temp->data;
            q.push(temp->right);
        }
    }
    return true;
}
int main()
{
    int n;
    cin>>n;
    int now,le,ri;
    for(int i=1;i<=n;i++)
    {
        cin>>now>>le>>ri;
        if(i==1)
            root=node_insert(now,le,ri);
        else node_insert(now,le,ri);
    }
    if(check_tree(root))
        cout<<"The tree is a valid BST."<<endl;
    else cout<<"The tree is NOT a valid BST."<<endl;
    return 0;
}